﻿import { IndexBase } from "./IndexBase";

class SkPair<K, V> {
    public key: K;
    public value: V;
    public constructor(k: K, v: V) {
        this.key = k;
        this.value = v;
    }
}

/**
 * 这个类最好用Map来做，但比较用的接口没法自己指定。
 * 
 */
export class KeyValueMap {
    //SkPair<K, V>
    private _arr: Array<{ key: IndexBase, value: number }>;

    /**
     * 构造函数。
     */
    public constructor() {
        this._arr = new Array<{ key: IndexBase, value: number }>();
    }

    /*
     * 获取长度。
     */
    public get size(): number {
        return this._arr.length;
    }

    /**
     * 清空内容。 
     */
    public clear(): void {
        this._arr = new Array<{ key: IndexBase, value: number }>();
    }

    /**
     * 删除一个键值对。
     * @param key 键
     */
    public delete(key: IndexBase): boolean {
        var len = this._arr.length;
        for (var i = 0; i < len; i++) {
            var pair = this._arr[i];
            if (pair.key.equals(key)) {
                delete this._arr[i];
                return true;
            }
        }
        return false;
    }

    /**
     * 通过键key查找值val.
     * 
     * @param key 键
     */
    public get(key: IndexBase): number | undefined {
        var len = this._arr.length;
        for (var i = 0; i < len; i++) {
            var pair = this._arr[i];
            if (pair.key.equals(key)) {
                return pair.value;
            }
        }
        return undefined;
    }

    /**
     * 是否包含键key。
     * 
     * @param key 键
     */
    public has(key: IndexBase): boolean {
        var len = this._arr.length;
        for (var i = 0; i < len; i++) {
            var pair = this._arr[i];
            if (pair.key.equals(key)) {
                return false;
            }
        }
        return false;
    }

    /**
     * 设置键值对。
     * 
     * @param key 键
     * @param value 值
     */
    public set(key: IndexBase, value: number): this {
        var len = this._arr.length;
        for (var i = 0; i < len; i++) {
            var pair = this._arr[i];
            if (pair.key.equals(key)) {
                pair.value = value;
                return this;
            }
        }
        this._arr.push({ key, value });
        return this;
    }
}